// Read all the api from current documents

const glob = require('glob');
const fs = require('fs');

const COMPONENT_NAME = /components\/([^/]*)/;
const PROP_NAME = /^\s*\|\s*([^\s|]*)/;

const components = {};

function mappingPropLine(component, line) {
    const propMatch = line.match(PROP_NAME);
    if (!propMatch) return;

    const propName = propMatch[1];
    if (!/^[a-z]/.test(propName)) return;

    components[component] = Array.from(
        new Set([...(components[component] || []), propName]),
    );
}

function apiReport(entities) {
    const apis = {};
    Object.keys(entities).forEach((component) => {
        const apiList = entities[component];
        apiList.forEach((api) => {
            if (typeof apis[api] === 'function') {
                apis[api] = [];
            }
            apis[api] = [...(apis[api] || []), component];
        });
    });

    return apis;
}

function printReport(apis) {
    const apiList = Object.keys(apis).map((api) => ({
        name: api,
        componentList: apis[api],
    }));
    apiList.sort((a, b) => b.componentList.length - a.componentList.length);
    // eslint-disable-next-line no-console
    console.log('| name | components | comments |');
    // eslint-disable-next-line no-console
    console.log('| ---- | ---------- | -------- |');
    apiList.forEach(({ name, componentList }) => {
        // eslint-disable-next-line no-console
        console.log('|', name, '|', componentList.join(', '), '| |');
    });
}

module.exports = () => {
    glob('components/*/*.md', (error, files) => {
        files.forEach((filePath) => {
            // Read md file to parse content
            const content = fs.readFileSync(filePath, 'utf8');
            const component = filePath.match(COMPONENT_NAME)[1];

            // Parse lines to get API
            const lines = content.split(/[\r\n]+/);
            lines.forEach((line) => {
                mappingPropLine(component, line);
            });
        });

        printReport(apiReport(components));
    });
};
